class Movimiento < ActiveRecord::Base
  validates_presence_of :usuario_id
  validates_presence_of :valor
  validates_presence_of :fecha
  validates_presence_of :tipo_movimiento_id
  validates_numericality_of :valor, :greater_than => 0
  belongs_to :usuario
  belongs_to :importacion
  belongs_to :tipo_movimiento
  belongs_to :recibo
  belongs_to :prestamo

  attr_writer :usuario_nombre
  delegate :nombre, :to => :usuario, :prefix => true, :allow_nil => true
  delegate :num_cuenta, :to => :usuario, :prefix => true, :allow_nil => true
  delegate :ci, :to => :usuario, :prefix => true, :allow_nil => true
  named_scope :descuentos, :joins => :tipo_movimiento, :conditions => {:tipos_movimientos => {:tipo => 0}}
  named_scope :creditos, :joins => :tipo_movimiento, :conditions => {:tipos_movimientos => {:tipo => 1}}
  named_scope :por_afecta_aguinaldo, lambda{|aguinaldo| {:include=>:tipo_movimiento,:conditions=>["tipos_movimientos.afecta_aguinaldo=?",aguinaldo]}}
  named_scope :sin_adelantos_de_aguinaldo,{:include=>:tipo_movimiento,
    :conditions=>["tipos_movimientos.id<>?",Parametro.find_by_codigo('PTMOV03').try(:valor).try(:to_i)]}
  named_scope :adelantos_de_aguinaldo,{:include=>:tipo_movimiento,
    :conditions=>["tipos_movimientos.id=?",Parametro.find_by_codigo('PTMOV03').try(:valor).try(:to_i)]}
  named_scope :predefinidos, :conditions => {:predefinido => 1}
  named_scope :sin_prestamos,  :conditions => ["tipo_movimiento_id <> ?", APP_CONFIG[:prestamo_id]]
  named_scope :periodo, lambda { |desde, hasta|
    {:conditions => ["fecha >= ? and fecha <= ?", desde, hasta]}
  }
  named_scope :recientes, lambda {
    fecha = Time.now.at_end_of_month
    {:conditions => ["fecha <= ?", fecha], :order => "fecha desc", :limit => 20, :include=>:recibo}
  }

  named_scope :ignorar_liberado_por_caja,  :conditions => ["tipo_movimiento_id <> ?",  62]
  named_scope :solo_liberados_por_caja,  :conditions => ["tipo_movimiento_id = ?",62]

  named_scope :praeps,  :conditions => {:tipo_movimiento_id => APP_CONFIG[:praep]}
  named_scope :ivas,  :conditions => {:tipo_movimiento_id => APP_CONFIG[:iva]}
  named_scope :comisiones,  :conditions => {:tipo_movimiento_id => APP_CONFIG[:comision]}
  named_scope :sin_comisiones,  :conditions => ["tipo_movimiento_id <> ?", APP_CONFIG[:comision]]
  named_scope :horas_extras,  :conditions => {:tipo_movimiento_id => APP_CONFIG[:horas_extras]}
  named_scope :viaticos,  :conditions => {:tipo_movimiento_id => APP_CONFIG[:viatico]}
  named_scope :bonificaciones,  :conditions => {:tipo_movimiento_id => APP_CONFIG[:bonificacion_familiar]}
  named_scope :regencias,  :conditions => {:tipo_movimiento_id => APP_CONFIG[:regencia]}
  named_scope :plus,  :conditions => {:tipo_movimiento_id => APP_CONFIG[:plus]}
  named_scope :premios,  :conditions => {:tipo_movimiento_id => APP_CONFIG[:premios]}


  default_scope :order => :fecha,:include=>:tipo_movimiento

  #TODO: ARREGLAR PATCH ADAMS: cambiar la forma de recuperar los movimientos liberados por caja (tambien en los named scopes).
  def descripcion
    self.tipo_movimiento_id == 62 ? "#{self.tipo_movimiento.nombre} (#{self.texto})" : self.tipo_movimiento.nombre
  end

  def self.check_predefinidos(anho, mes)
    desde = Time.mktime(anho, mes)
    hasta = Time.mktime(anho,mes).at_end_of_month
    if Movimiento.find(:first, :conditions => ["fecha >= ? and fecha <= ? and predefinido = 1", desde, hasta])
      true
    else
      false
    end
  end
  def sumar?
    self.tipo_movimiento.try(:tipo) == 0 ? false : true
  end

  #Texto de referencia al recibo
  def ref_recibo
    self.recibo.nil? ? "No Procesado" : self.recibo.ref
  end

  def monto_deposito
    valor
  end

  def cuenta_deposito
    usuario_num_cuenta.to_i
  end

  def documento_deposito
    usuario_ci.to_s
  end

  def referencia

  end

  def comentario

  end

  def nombre_orden
    usuario_nombre
  end

  def nro_factura
    nro_cheque
  end
end
